package com.lyx.rpc.spi.factory;

import com.lyx.rpc.spi.annotation.SPI;
import com.lyx.rpc.spi.loader.ExtensionLoader;

import java.util.Optional;

/**
 * @Author by lyx
 * SpiExtensionFactory类表示基于SPI实现的扩展类加载器工厂类
 */
public class SPIExtensionFactory implements ExtensionFactory {
    @Override
    public <T> T getExtension(final String key, final Class<T> clazz) {
        return Optional.ofNullable(clazz)
            .filter(Class::isInterface) // 确保传入的clazz是一个接口类型
            .filter(cls -> cls.isAnnotationPresent(SPI.class)) // 检查传入的接口cls是否带有SPI注解
            .map(ExtensionLoader::getExtensionLoader) // 获取该接口的ExtensionLoader
            .map(ExtensionLoader::getDefaultSpiClassInstance)
            .orElse(null);
    }
}
